#ifndef INODE_H_
#define INODE_H_

#include "../../include/defs.h"

//bits del flag de mode del archivo--------------------------------------
#define READ_BIT 4
#define WRITE_BIT 2
#define EXEC_BIT 1
#define FILE_BIT 8
#define DIR_BIT 16
//------------------------------------------------------------------------

#define BLOCKS_PER_INODE 10
typedef struct{
	short int mode;	//flag que indica si es directorio o comun, y rwx bits
	int fileSize;	//tamano del archivo en bytes
	int blockNum[BLOCKS_PER_INODE];	//numero de bloque en disco donde se encuentra el archivo
}inode_t;

typedef struct{
	int inodeNum;
	inode_t inode;
	short int timesOpened;	//cuantas veces fue abierto el archivo
	char openedForWrite;
}inodeTableEntry;

//obtiene un inodo en base al path de un archivo
inodeTableEntry * getInode(char * filePath);

//disminuye la cantidad de links que tiene el inodo, y si puede
//lo devuelve a disco
void putInode(inodeTableEntry * inode);

//crea un nuevo inodo a partir del nombre al final de filePath y lo devuelve,
//o en caso de que ya exista un archivo con ese nombre en el directorio
//devuelve su inodo. en parentInode queda el numero del inodo del directorio
//en el que se encuentra.
//flags me dice que hacer en caso de que el inodo ya exista
inodeTableEntry * createInode(char * filePath, int * parentInode, int flags);

//copia un inodo y lo devuelve
inodeTableEntry * copyInode(inodeTableEntry * inode);

//deja en name, si entra, el path entero hasta el current directory
int findCurrDirPath(char * name, int size);


#define DIR_UNLINK 1
#define FILE_UNLINK 2
//trata de borrar un archivo o directorio. opNum indica que se esta borrando.
//Devuelve -1 en caso de error
int doUnlink(const char * pathParam, int opNum);


#endif /* INODE_H_ */
